// directional-property mixins are shorthands
// for writing properties like the following
//
// @include margin(null 0 10px);
// ------
// margin-right: 0;
// margin-bottom: 10px;
// margin-left: 0;
//
// - or -
//
// @include border-style(dotted null);
// ------
// border-top-style: dotted;
// border-bottom-style: dotted;
//
// ------
//
// Note: You can also use false instead of null

@function collapse-directionals($vals) {
  $output: null;

  $A: nth( $vals, 1 );
  $B: if( length($vals) < 2, $A, nth($vals, 2));
  $C: if( length($vals) < 3, $A, nth($vals, 3));
  $D: if( length($vals) < 2, $A, nth($vals, if( length($vals) < 4, 2, 4) ));

  @if $A == 0 { $A: 0 }
  @if $B == 0 { $B: 0 }
  @if $C == 0 { $C: 0 }
  @if $D == 0 { $D: 0 }

  @if $A == $B and $A == $C and $A == $D { $output: $A          }
  @else if $A == $C and $B == $D         { $output: $A $B       }
  @else if $B == $D                      { $output: $A $B $C    }
  @else                                  { $output: $A $B $C $D }

  @return $output;
}

@function contains-falsy($list) {
  @each $item in $list {
    @if not $item {
      @return true;
    }
  }

  @return false;
}

@mixin directional-property($pre, $suf, $vals) {
  // Property Names
  $top:    $pre + "-top"    + if($suf, "-#{$suf}", "");
  $bottom: $pre + "-bottom" + if($suf, "-#{$suf}", "");
  $left:   $pre + "-left"   + if($suf, "-#{$suf}", "");
  $right:  $pre + "-right"  + if($suf, "-#{$suf}", "");
  $all:    $pre +             if($suf, "-#{$suf}", "");

  // Get list inside $vals (is there a better way?)
  @each $val in $vals { $vals: $val; }

  $vals: collapse-directionals($vals);

  @if contains-falsy($vals) {
    @if nth($vals, 1) { #{$top}: nth($vals, 1); }

    @if length($vals) == 1 {
      @if nth($vals, 1) { #{$right}: nth($vals, 1); }
    } @else {
      @if nth($vals, 2) { #{$right}: nth($vals, 2); }
    }

    // prop: top/bottom right/left
    @if length($vals) == 2 {
      @if nth($vals, 1) { #{$bottom}: nth($vals, 1); }
      @if nth($vals, 2) { #{$left}:   nth($vals, 2); }

    // prop: top right/left bottom
    } @else if length($vals) == 3 {
      @if nth($vals, 3) { #{$bottom}: nth($vals, 3); }
      @if nth($vals, 2) { #{$left}:   nth($vals, 2); }

    // prop: top right bottom left
    } @else if length($vals) == 4 {
      @if nth($vals, 3) { #{$bottom}: nth($vals, 3); }
      @if nth($vals, 4) { #{$left}:   nth($vals, 4); }
    }

  // prop: top/right/bottom/left
  } @else {
    #{$all}: $vals;
  }
}

@mixin margin($vals...) {
  @include directional-property(margin, false, $vals);
}

@mixin padding($vals...) {
  @include directional-property(padding, false, $vals);
}

@mixin border-style($vals...) {
  @include directional-property(border, style, $vals);
}

@mixin border-color($vals...) {
  @include directional-property(border, color, $vals);
}

@mixin border-width($vals...) {
  @include directional-property(border, width, $vals);
}
